/**
 * @created by jiangcheng 2018-02-27
 * @updated by liujie yufp.config增加debug参数 2018-06-01
 * @description 全局配置入口
 */
(function (window, yufp) {
    var config = window.YUFP_SYS_CONFIG,
        debug = config.debugModel,
        mockModel = config.mockModel;
    window.mxBasePath = './libs/mxgraph';
    webLogAble = config.webLogAble,
        langList = [];
    window.comLang = {};
    var l = window.localStorage.getItem('language');
    l && (l = l.substring(2), window.YUFP_SYS_CONFIG.language = l);
    yufp.config({
        // 别名配置
        alias: {
            'vue': './libs/vue/vue' + (debug ? '' : '.min') + '-2.5.13.js',
            'mock': './libs/mockjs/mock' + (debug ? '' : '.min') + '.js',
            'jquery': './libs/jquery/jquery' + (debug ? '' : '.min') + '.js',
            'mxgraph': 'libs/mxgraph/mxClient.js',
            'echarts': './libs/echarts/echarts.min.js',
            'pltable': 'libs/pl-table/lib/index.js',
            'jsplumb': './libs/jsPlumb/jsPlumb-1.7.9.js'
        },
        charset: config.charset,
        version: config.version,
        debug: config.debugModel
    });

    // 前端组件语言文件加载
    langList = [
        './themes/lang/' + window.YUFP_SYS_CONFIG.language + '/common/component.js'];
    yufp.require.require(langList, function () {
        window.comLang = yufp.require.use(langList[0]).component;
    });

    // 首先加载，否则会出现菜单为NULL的情况
    if (config.multiLanguage) {
        // yufp.require.require('./themes/lang/' + window.YUFP_SYS_CONFIG.language + '/pages/common/login/login.js');
        yufp.require.require('./themes/lang/' + window.YUFP_SYS_CONFIG.language + '/common/menu.js');
        yufp.require.require('./themes/lang/' + window.YUFP_SYS_CONFIG.language + '/common/lookup.js');
    }

    // css依赖库
    var libsCss = [
        './libs/element-ui/index.css',
        './themes/common/icoFonts/icoFonts.css',
        './themes/common/iconfont/iconfont.css',
        './themes/default/main.css',
        './custom/widgets/css/bus.css',
        './themes/common/treeIcoFont/iconfont.css'
    ];

    // js依赖库
    var libsJs = [
        'vue',
        'jquery',
        'pltable',
        'mxgraph',
        './libs/polyfill/es6-promise.auto.min.js',
        './libs/element-ui/index.js',
        './libs/echarts/echarts.min.js',

        './custom/common/app.data.service.js',
        './custom/plugins/yufp.settings.js',
        './custom/plugins/yufp.language.js',
        './custom/plugins/yufp.localstorage.js',
        './custom/plugins/yufp.sessionstorage.js',
        './custom/plugins/yufp.service.js',
        './custom/plugins/yufp.validator.js',
        './custom/plugins/yufp.util.js',
        './custom/plugins/yufp.lookup.js',
        './custom/plugins/yufp.session.js',
        './custom/plugins/yufp.frame.js',
        './custom/plugins/yufp.messagelookup.js',
        './custom/common/app.js',
        // 使用静态菜单
        './custom/common/app.data.menu.js',
        './themes/common/treeIcoFont/iconfont.js'
    ];
    // 路由表
    var routeTables = [
        './custom/route-tables/route.common.js',
        './custom/route-tables/route.echain.js'
    ];
    // 合并lib
    var libs = libsCss.concat(libsJs, routeTables);
    yufp.require.use(libs).done(function () {
        // yufp别名
        window.yu = window.yufp;
        // 设置配置
        yufp.settings.config(config);
        // mock加载
        if (mockModel) {
            yufp.require.require('./mocks/index.js');
        }
        // 监控模式时，引入监控文件
        if (webLogAble) {
            // 监控需要增加tfp 指纹信息
            yufp.require.require('custom/plugins/yufp.tfp.js');
            yufp.require.require('custom/plugins/yufp.monitor.js');
        }
        // 多语言加载
        window.YUFP_SYS_CONFIG.language = yufp.localStorage.get('language') || window.YUFP_SYS_CONFIG.language;
        yufp.require.require('./libs/vuei18n/vue-i18n.js');
        // 1、框架及自定义组件语言文件加载
        yufp.require.use('./themes/lang/' + window.YUFP_SYS_CONFIG.language + '/common/widget.js');
        yufp.require.use('./themes/lang/' + window.YUFP_SYS_CONFIG.language + '/common/menu.js');
        yufp.require.use('./themes/lang/' + window.YUFP_SYS_CONFIG.language + '/common/yuwp.js');
        // 2、逻辑系统、菜单、字典项、提示消息语言文件加载
        if (config.multiLanguage) {
            var languageList = yufp.clone(yufp.frame.baseFrameOptions.languageList, []);
            var languageLibs = [];
            // 循环遍历，添加公共语言文件。
            for (var i = 0; i < languageList.length; i++) {
                var element = languageList[i];
                if (element.id === window.YUFP_SYS_CONFIG.language) {
                    languageLibs.push('./themes/lang/' + element.id + '/index.js');
                }
            }
            if (languageLibs.length > 0) {
                yufp.require.require(languageLibs, function () {
                    var locate = {};
                    for (var i = 0; i < languageList.length; i++) {
                        var element = languageList[i];
                        yufp.extend(locate, window['global_' + element.id]);
                    }
                    Vue.config.locate = locate;
                });
            }
        }
        // 紧凑模式
        if (config.compactMode) {
            yufp.require.require('./themes/common/compact.css');
        }
        // 加入请求过滤器
        yufp.service.addFilter({
            // 过滤器名称
            name: 'messageParser',
            // 请求前触发
            before: function (event) {
                // 定义请求头
                var headers = {};
                // 定义请求数据
                var reqData = {
                    // 请求头
                    headers: headers,
                    // 请求数据
                    data: event.data
                };
                // 保存导出数据
                event.code = 0;
                event.data = reqData;
                // 返回处理标志，true则继续处理，false则中断处理
                return true;
            },

            // 数据返回后触发
            after: function (event) {
                // 只处理JSON对象
                if (yufp.type(event.data) == 'object' && yufp.type(event.data.header) != 'undefined') {
                    // 获取响应头
                    var rspHeader = event.data.header;
                    // 获取响应数据
                    var rspData = event.data.data;

                    if (yufp.type(rspHeader.code) == 'undefined' || rspHeader.code == 0) {
                        // 保存导出数据
                        event.code = 0;
                        event.message = '';
                        event.data = rspData;
                        // 返回处理标志，true则继续处理，false则中断处理
                        return true;
                    } else {
                        // 保存导出数据
                        event.code = rspHeader.code;
                        event.message = rspHeader.msg;
                        event.data = rspData;
                        // 返回处理标志，true则继续处理，false则中断处理
                        return true;
                    }
                }

                // 返回处理标志，true则继续处理，false则中断处理
                return true;
            },
            // HTTP请求异常
            exception: function (event) {
                var status = event.xhr.status;
                var flag = true;
                var globalVm = yufp.util.globalVm;
                switch (status) {
                    case 401:
                        var responseUrl = event.requestUrl;
                        // 服务平台坑（/api/logout注销会在请求头带token，若token已过期，也会走到此处)
                        if (responseUrl.indexOf(yufp.session.settings.logoutUrl) < 0) {
                            // 判断非注销服务造成的401，才走此逻辑
                            yufp.session.logout(true);
                        }
                        flag = false;
                        break;
                    case 403:
                        globalVm.$message({
                            message: window.comLang.SysMsg_001,
                            type: 'warning'
                        });
                        flag = false;
                        break;
                    case 404:
                        globalVm.$message({
                            message: window.comLang.SysMsg_002,
                            type: 'error'
                        });
                        flag = false;
                        break;
                    default:
                        globalVm.$message({
                            message: window.comLang.SysMsg_002,
                            type: 'error'
                        });
                        flag = false;
                        break;
                }
                return flag;
            }
        });

        // 设置默认root id
        yufp.router.setDefaultRootId(config.defaultRootId);
        // 加入路由过滤器
        yufp.router.addFilter({

            /**
             * 过滤器名称
             */
            name: 'default',

            /**
             * 路由跳转前执行
             * @param code
             * @param cite
             */
            before: function (code, data, cite) {
                if (window.YUFP_SYS_CONFIG.sugoModel && typeof window.sugoio != 'undefined') {
                    var sugoLoad = window.sugoio.load;
                    cite.options && cite.options.title ? sugoLoad && sugoLoad(code, cite.options) : '';
                }
                var route;
                if (config.debugModel) {
                    route = yufp.router.getRoute(code) || {};
                    yufp.logger.info('【Router-JS】【' + code + '】: ' + route.js);
                }
                // 多语言标志位true 时才设置前缀--取消默认加载页面语言文件 update by liucheng3 2019-12-26
                // if (config.multiLanguage) {
                //   route = yufp.router.getRoute(code) || {};
                //   var prefix = route.js.substring(0, route.js.lastIndexOf('.'));
                //   var languageList = yufp.clone(yufp.frame.language, []);
                //   // 循环遍历，添加页面名称相同的带语言类型后缀的js语言文件
                //   for (var i = 0; i < languageList.length; i++) {
                //     var element = languageList[i];
                //     if (element.mapping === window.YUFP_SYS_CONFIG.language || element.id === window.YUFP_SYS_CONFIG.language) {
                //       if (element.mapping) {
                //         yufp.require.require('./themes/lang/' + element.mapping + '/' + prefix + '.js');
                //       } else {
                //         yufp.require.require('./themes/lang/' + element.id + '/' + prefix + '.js');
                //       }
                //     }
                //   }
                //   cite.prefix = code;
                // }
                return true;
            },

            /**
             * 加载路由内容前执行
             * @param code
             * @param cite
             */
            mount: function (code, cite) {
            },

            /**
             * ready函数执行
             * @param exports
             * @param code
             * @param data
             * @param cite
             */
            ready: function (exports, code, data, cite) {
            },

            /**
             * 卸载路由内容前执行
             * @param code
             * @param cite
             */
            unMount: function (code, cite) {
                if (window.YUFP_SYS_CONFIG.sugoModel && typeof window.sugoio != 'undefined') {
                    var sugoUnLoad = window.sugoio.unload;
                    cite.options && cite.options.title ? sugoUnLoad && sugoUnLoad(code, cite.options) : '';
                }
            },

            /**
             * destroy函数执行
             * @param exports
             * @param code
             * @param cite
             */
            destroy: function (exports, code, cite) {
            }
        });

        /**
         * 创建hash处理事件
         */
        var hashFn = function () {
            var hash = location.hash ? location.hash : '';
            var data = {}; // 路由参数
            var route = config.startPage; // 启动路由
            var currRoute = yufp.session.getCurrentRoute();
            route = currRoute || route;
            var sIndex = hash.indexOf('!'),
                eIndex = hash.indexOf('?');
            if (sIndex != -1) {
                route = eIndex != -1 ? hash.substring(sIndex + 1, eIndex) : hash.slice(sIndex + 1);
            }
            data = yufp.urlParam2Object(location.search); // 问号参数转换
            if (eIndex != -1 && hash.slice(eIndex + 1)) {
                yufp.extend(data, yufp.urlParam2Object(hash.slice(eIndex))); // hash参数转换, 并合并至data路由参数中
            }

            // yufp.logger.info('触发hash事件,hash:' + hash);
            // 调试模式true时，有mocks请求，故延迟加载
            var delay = mockModel ? 500 : 100;
            if (data.debug && route.indexOf('%2F')) {
                // IDE 预览入口
                var idePreview = 'idePreview',
                    url = decodeURIComponent(route);
                route = 'frame';
                var t = new Date().getTime();
                yufp.router.addRoute(idePreview, {
                    html: url + '.html?t=' + t,
                    js: url + '.js?t=' + t
                });
                setTimeout(function () {
                    // mock & debug模式，token不存在情况下，允许临时塞一个假token以实现模拟预览
                    if (config.debugModel && !yufp.service.getToken()) {
                        var suffix = new Date().getTime();
                        yufp.service.putToken({
                            'access_token': 'Basicd2ViX2FwcDo=' + suffix,
                            'expires_in': 600, // 单位：秒
                            'refresh_token': 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9' + suffix
                        });
                    }
                    yufp.session.loadUserSession(function () {
                        yufp.router.to(route, data);
                        setTimeout(function () {
                            yufp.frame.addTab({
                                id: idePreview, // 菜单功能ID（路由ID）
                                key: 'custom_' + t, // 自定义唯一页签key,请统一使用custom_前缀开头
                                title: window.comLang.IDE_preview, // 页签名称
                                data: data
                            });
                        }, 500);
                    });
                }, delay);
            } else if (route == config.startPage) {
                // 主页入口
                setTimeout(function () {
                    yufp.router.to(route, data);
                }, delay);
            } else {
                setTimeout(function () {
                    yufp.session.loadUserSession(function () {
                        yufp.router.to(route, data);
                    });
                }, delay);
            }
            // 多语言title翻译
            // document.title = config.multiLanguage ? window.comLang.document_title : 'YUDP统一开发平台-宇信科技';
        };
        // 添加hash change事件
        if (window.addEventListener) {
            window.addEventListener('hashchange', hashFn, false);
        } else if (window.attachEvent) {
            window.attachEvent('on' + 'hashchange', hashFn);
        } else {
            window['onhashchange'] = hashFn;
        }
        // 页面跳转
        hashFn();
    });
}(window, yufp));
